Despliegue de los resultados Bogotá D.C

In [1]:
# Importar paquetes
import matplotlib.pyplot as plt
import datetime
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from fbprophet import Prophet
import warnings
warnings.filterwarnings('ignore')
import seaborn as sns
!pip install plotly
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import datetime as dt
from datetime import timedelta
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score,silhouette_samples
from sklearn.linear_model import LinearRegression,Ridge,Lasso
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error,r2_score
from sklearn.preprocessing import PolynomialFeatures
import statsmodels.api as sm
from statsmodels.tsa.api import Holt,SimpleExpSmoothing,ExponentialSmoothing
from statsmodels.tsa.stattools import adfuller
std=StandardScaler()
from pmdarima.arima import auto_arima
pd.set_option('display.float_format', lambda x: '%.6f' % x)
Requirement already satisfied: plotly in c:\users\itco10096\.conda\envs\apc\lib\site-packages (4.9.0)
Requirement already satisfied: retrying>=1.3.3 in c:\users\itco10096\.conda\envs\apc\lib\site-packages (from plotly) (1.3.3)
Requirement already satisfied: six in c:\users\itco10096\.conda\envs\apc\lib\site-packages (from plotly) (1.15.0)
In [2]:
dfCovid = pd.read_csv('https://www.datos.gov.co/api/views/gt2j-8ykr/rows.csv')
In [3]:
dfCovid.head(10)
Out[3]:
ID de caso Fecha de notificación Código DIVIPOLA Ciudad de ubicación Departamento o Distrito atención Edad Sexo Tipo Estado ... FIS Fecha de muerte Fecha diagnostico Fecha recuperado fecha reporte web Tipo recuperación Codigo departamento Codigo pais Pertenencia etnica Nombre grupo etnico
0 1 2020-03-02T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 19 F Importado Leve ... 2020-02-27T00:00:00.000 NaN 2020-03-06T00:00:00.000 2020-03-13T00:00:00.000 2020-03-06T00:00:00.000 PCR 11 380.000000 Otro NaN
1 2 2020-03-06T00:00:00.000 76111 Guadalajara de Buga Valle del Cauca Recuperado 34 M Importado Leve ... 2020-03-04T00:00:00.000 NaN 2020-03-09T00:00:00.000 2020-03-19T00:00:00.000 2020-03-09T00:00:00.000 PCR 76 724.000000 Otro NaN
2 3 2020-03-07T00:00:00.000 5001 Medellín Antioquia Recuperado 50 F Importado Leve ... 2020-02-29T00:00:00.000 NaN 2020-03-09T00:00:00.000 2020-03-15T00:00:00.000 2020-03-09T00:00:00.000 PCR 5 724.000000 Otro NaN
3 4 2020-03-09T00:00:00.000 5001 Medellín Antioquia Recuperado 55 M Relacionado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-26T00:00:00.000 2020-03-11T00:00:00.000 PCR 5 nan Otro NaN
4 5 2020-03-09T00:00:00.000 5001 Medellín Antioquia Recuperado 25 M Relacionado Leve ... 2020-03-08T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-23T00:00:00.000 2020-03-11T00:00:00.000 PCR 5 nan Otro NaN
5 6 2020-03-10T00:00:00.000 5360 Itagüí Antioquia Recuperado 27 F Relacionado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-26T00:00:00.000 2020-03-11T00:00:00.000 PCR 5 nan Otro NaN
6 7 2020-03-08T00:00:00.000 13001 Cartagena de Indias Cartagena D.T. y C. Recuperado 85 F Importado Leve ... 2020-03-02T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-17T00:00:00.000 2020-03-11T00:00:00.000 PCR 13 840.000000 Otro NaN
7 8 2020-03-09T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 22 F Importado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-21T00:00:00.000 2020-03-11T00:00:00.000 PCR 11 724.000000 Otro NaN
8 9 2020-03-08T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 28 F Importado Leve ... 2020-03-07T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-23T00:00:00.000 2020-03-11T00:00:00.000 PCR 11 724.000000 Otro NaN
9 10 2020-03-12T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 36 F Importado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-12T00:00:00.000 2020-03-21T00:00:00.000 2020-03-12T00:00:00.000 PCR 11 724.000000 Otro NaN

10 rows × 21 columns

In [4]:
# Modificar el tipo de datos para las variables de fechas.
dfCovid['Fecha de notificación']= pd.to_datetime(dfCovid['Fecha de notificación'])
dfCovid[ 'Fecha de muerte']= pd.to_datetime(dfCovid['Fecha de muerte'])
dfCovid['Fecha diagnostico']= pd.to_datetime(dfCovid['Fecha diagnostico'])
dfCovid['Fecha recuperado']= pd.to_datetime(dfCovid['Fecha recuperado'])
dfCovid['fecha reporte web']= pd.to_datetime(dfCovid['fecha reporte web'])
In [5]:
# Limpieza de los resultados para el atributo atención.
dfCovid['atención'].unique()
dfCovid['atención']= dfCovid['atención'].replace({'CASA':'Casa'})
dfCovid['atención']= dfCovid['atención'].fillna('No especifica')
In [6]:
fechas= sorted(pd.concat([dfCovid['Fecha de notificación'],dfCovid['Fecha diagnostico'],dfCovid['Fecha de muerte'],dfCovid['Fecha recuperado'],dfCovid['fecha reporte web']]).unique())
fechas=np.arange(min(fechas),max(fechas),np.timedelta64(86400000000000,'ns'))
dfCovid_Nuevo=pd.DataFrame({'Fecha':fechas})
dfCovid_Nuevo['Muertos']=np.zeros(len(dfCovid_Nuevo))
dfCovid_Nuevo['Confirmados']=np.zeros(len(dfCovid_Nuevo))
dfCovid_Nuevo['Recuperados']=np.zeros(len(dfCovid_Nuevo))
dfCovid_Nuevo
Out[6]:
Fecha Muertos Confirmados Recuperados
0 2020-03-02 0.000000 0.000000 0.000000
1 2020-03-03 0.000000 0.000000 0.000000
2 2020-03-04 0.000000 0.000000 0.000000
3 2020-03-05 0.000000 0.000000 0.000000
4 2020-03-06 0.000000 0.000000 0.000000
... ... ... ... ...
182 2020-08-31 0.000000 0.000000 0.000000
183 2020-09-01 0.000000 0.000000 0.000000
184 2020-09-02 0.000000 0.000000 0.000000
185 2020-09-03 0.000000 0.000000 0.000000
186 2020-09-04 0.000000 0.000000 0.000000

187 rows × 4 columns

BOGOTA

In [7]:
# Se filtra por la ciudad de interés
nombre='Bogotá D.C.'
x=dfCovid[dfCovid['Ciudad de ubicación']==nombre].sort_values(by='Fecha de muerte',ascending=False)
x=x[['ID de caso','atención','fecha reporte web','Fecha de muerte','Fecha de notificación','Fecha diagnostico','Fecha recuperado']]
x
Out[7]:
ID de caso atención fecha reporte web Fecha de muerte Fecha de notificación Fecha diagnostico Fecha recuperado
404927 404968 Fallecido 2020-08-11 2020-09-05 2020-08-05 2020-08-11 NaT
207261 207302 Recuperado 2020-07-21 2020-09-05 2020-07-04 2020-07-18 2020-08-24
531149 531190 Fallecido 2020-08-22 2020-09-05 2020-08-19 2020-08-21 NaT
520488 520529 Fallecido 2020-08-21 2020-09-05 2020-08-19 2020-08-20 NaT
544328 544369 Fallecido 2020-08-24 2020-09-05 2020-08-22 2020-08-23 NaT
... ... ... ... ... ... ... ...
653229 653270 Casa 2020-09-05 NaT 2020-08-23 2020-09-03 NaT
653230 653271 Casa 2020-09-05 NaT 2020-08-23 2020-09-03 NaT
653231 653272 Casa 2020-09-05 NaT 2020-08-23 2020-09-03 NaT
653232 653273 Hospital UCI 2020-09-05 NaT 2020-08-23 2020-09-03 NaT
653233 653274 Casa 2020-09-05 NaT 2020-08-24 2020-09-04 NaT

223522 rows × 7 columns

In [8]:
# Se construye el Data Set Covid-19

#Conteo de muertos
m=x[x['atención']=='Fallecido'].groupby('Fecha de muerte').count()
m=pd.DataFrame({'Fecha':m.index.values,'Muertos':[n for n in m.values[:,0]]})

#Conteo de Confirmados
c=x.groupby('Fecha de notificación').count()
c=pd.DataFrame({'Fecha':c.index.values,'Confirmados':[n for n in c.values[:,0]]})

#Conteo Recuperados
r=x.groupby('Fecha recuperado').count()
r=pd.DataFrame({'Fecha':r.index.values,'Recuperados':[n for n in r.values[:,0]]})

df_Nuevo=pd.concat([dfCovid_Nuevo,c,m,r])
df_Nuevo.sort_values(by='Fecha',ascending=True)
df_Nuevo=df_Nuevo.groupby('Fecha').sum().sort_values(by='Fecha',ascending=True)

def acum(df,Col):
  m=df[Col].values
  d=0
  L=[]
  for n in m:
    d=d+n
    L.append(d)
  return L

df_Nuevo['Acum_muertos']=acum(df_Nuevo,'Muertos')
df_Nuevo['Acum_confirmados']=acum(df_Nuevo,'Confirmados')
df_Nuevo['Acum_Recuperados']=acum(df_Nuevo,'Recuperados')
df_Nuevo['Acum_Activos']=df_Nuevo['Acum_confirmados']-df_Nuevo['Acum_Recuperados']-df_Nuevo['Acum_muertos']
df_Nuevo
Out[8]:
Muertos Confirmados Recuperados Acum_muertos Acum_confirmados Acum_Recuperados Acum_Activos
Fecha
2020-03-02 0.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-03 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-04 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-05 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-06 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
... ... ... ... ... ... ... ...
2020-09-01 43.000000 1760.000000 4431.000000 5635.000000 222207.000000 155661.000000 60911.000000
2020-09-02 45.000000 1182.000000 3440.000000 5680.000000 223389.000000 159101.000000 58608.000000
2020-09-03 41.000000 102.000000 1904.000000 5721.000000 223491.000000 161005.000000 56765.000000
2020-09-04 51.000000 17.000000 799.000000 5772.000000 223508.000000 161804.000000 55932.000000
2020-09-05 4.000000 14.000000 3320.000000 5776.000000 223522.000000 165124.000000 52622.000000

188 rows × 7 columns

ANÁLISIS EXPLORATORIO DE DATOS

In [9]:
print("Estructura del dataset: ",df_Nuevo.shape)
print("Variables con valores nulos",df_Nuevo.isnull().sum())
print("Tipo de variables del dataset",df_Nuevo.dtypes)
Estructura del dataset:  (188, 7)
Variables con valores nulos Muertos             0
Confirmados         0
Recuperados         0
Acum_muertos        0
Acum_confirmados    0
Acum_Recuperados    0
Acum_Activos        0
dtype: int64
Tipo de variables del dataset Muertos             float64
Confirmados         float64
Recuperados         float64
Acum_muertos        float64
Acum_confirmados    float64
Acum_Recuperados    float64
Acum_Activos        float64
dtype: object
In [10]:
print("Información Básica")
df_Nuevo.iloc(0)[-1]
Información Básica
Out[10]:
Muertos                 4.000000
Confirmados            14.000000
Recuperados          3320.000000
Acum_muertos         5776.000000
Acum_confirmados   223522.000000
Acum_Recuperados   165124.000000
Acum_Activos        52622.000000
Name: 2020-09-05 00:00:00, dtype: float64
In [11]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Activos"])
fig.update_layout(title="Distribución del número de casos activos en Bogotá D.C. ",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Bogotá D.C.",)
fig.show()
In [12]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"])
fig.update_layout(title="Distribución del número de casos cerrados en Bogotá D.C.",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Bogotá D.C.")
fig.show()
In [13]:
df_Nuevo["WeekOfYear"]=df_Nuevo.index.weekofyear

week_num=[]
weekwise_confirmed=[]
weekwise_recovered=[]
weekwise_deaths=[]
weekwise_active=[]
w=1
for i in list(df_Nuevo["WeekOfYear"].unique()):
    weekwise_confirmed.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_confirmados"].iloc[-1])
    weekwise_recovered.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Recuperados"].iloc[-1])
    weekwise_deaths.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_muertos"].iloc[-1])
    weekwise_active.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Activos"].iloc[-1])
    week_num.append(w)
    w=w+1

fig=go.Figure()
fig.add_trace(go.Scatter(x=week_num, y=weekwise_confirmed,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos confirmados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_recovered,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos recuperados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_deaths,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos de muerte'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_active,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos Activos'))
fig.update_layout(title="Crecimiento semanal de diferentes tipos de casos en Bogotá D.C.",
                 xaxis_title="Número de semanas",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [14]:
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(15,5))
sns.barplot(x=week_num,y=pd.Series(weekwise_confirmed).diff().fillna(0),ax=ax1)
sns.barplot(x=week_num,y=pd.Series(weekwise_deaths).diff().fillna(0),ax=ax2)
ax1.set_xlabel("Número de semanas")
ax2.set_xlabel("Número de semanas")
ax1.set_ylabel("Número de casos confirmados")
ax2.set_ylabel("Número de casos de fallecidos")
ax1.set_title("Aumento semanal del número de casos confirmados en Bogotá D.C.")
ax2.set_title("Aumento semanal del número de casos de muerte en Bogotá D.C.")
Out[14]:
Text(0.5, 1.0, 'Aumento semanal del número de casos de muerte en Bogotá D.C.')

Tasa de crecimiento de los casos confirmados, recuperados y de muerte

In [15]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',
                    name='Casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"],
                    mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"],
                    mode='lines+markers',
                    name='Casos de muertes'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"],
                    mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Crecimiento de los diferentes tipos de casos en Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()

Análisis de la tasa de moralidad y recuperación

In [16]:
df_Nuevo["Tasa de mortalidad"]=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Tasa de Recuperacion"]=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Casos Cerrados"]=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"]

print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].mean())
print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].median())
print("Promedio de la tasa de recuperación",df_Nuevo["Tasa de Recuperacion"].mean())
print("Tasa de recuperación media",df_Nuevo["Tasa de Recuperacion"].median())

#Plotting Mortality and Recovery Rate 
fig = make_subplots(rows=2, cols=1,
                   subplot_titles=("Tasa de Recuperacion", "Tasa de mortalidad"))
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de Recuperacion"),
    row=1, col=1
)
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de mortalidad"),
    row=2, col=1
)
fig.update_layout(height=1000,legend=dict(x=-0.1,y=1.2,traceorder="normal"))
fig.update_xaxes(title_text="Fecha", row=1, col=1)
fig.update_yaxes(title_text="Tasa de Recuperacion en Bogotá D.C.", row=1, col=1)
fig.update_xaxes(title_text="Fecha", row=1, col=2)
fig.update_yaxes(title_text="Tasa de mortalidad en Bogotá D.C.", row=1, col=2)
fig.show()
Tasa de mortalidad media 2.2032756478019886
Tasa de mortalidad media 2.3676421935386562
Promedio de la tasa de recuperación 29.424469880359997
Tasa de recuperación media 31.35030909390919
In [17]:
print("Aumento medio del número de casos confirmados cada día en Bogotá D.C.: ",np.round(df_Nuevo["Acum_confirmados"].diff().fillna(0).mean()))
print("Aumento medio del número de casos recuperados cada día en Bogotá D.C.: ",np.round(df_Nuevo["Acum_Recuperados"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de muerte cada día en Bogotá D.C.: ",np.round(df_Nuevo["Acum_muertos"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de activos cada día en Bogotá D.C.: ",np.round(df_Nuevo["Acum_Activos"].diff().fillna(0).mean()))

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().fillna(0),mode='lines+markers',
                    name='Casos de Muerte'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().fillna(0),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Aumento diario de los diferentes tipos de casos en Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
Aumento medio del número de casos confirmados cada día en Bogotá D.C.:  1189.0
Aumento medio del número de casos recuperados cada día en Bogotá D.C.:  878.0
Aumento promedio del número de casos de muerte cada día en Bogotá D.C.:  31.0
Aumento promedio del número de casos de activos cada día en Bogotá D.C.:  280.0
In [18]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Fallecidos'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Media móvil por cada 7 días de los casos confirmados, recuperados y de muerte en Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [19]:
print("Promedio de crecimiento medio del número de casos confirmados en Bogotá D.C.: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos confirmados en Bogotá D.C.: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).median())
print("Promedio de crecimiento medio del número de casos recuperados en Bogotá D.C.: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos recuperados en Bogotá D.C.: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).median())
print("Promedio de crecimiento medio del número de casos de muerte en Bogotá D.C.: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).mean())
print("Mediana de crecimiento medio del número de casos de muerte en Bogotá D.C.: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).median())

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos de muerte'))
fig.update_layout(title="Factor de crecimiento en función de la fecha de los diferentes tipos de casos en Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Factor de crecimiento",
                 legend=dict(x=0,y=-0.4,traceorder="normal"))
fig.show()
Promedio de crecimiento medio del número de casos confirmados en Bogotá D.C.:  1.076109329947746
Mediana de crecimiento medio del número de casos confirmados en Bogotá D.C.:  1.038275167419829
Promedio de crecimiento medio del número de casos recuperados en Bogotá D.C.:  inf
Mediana de crecimiento medio del número de casos recuperados en Bogotá D.C.:  1.0413793103448277
Promedio de crecimiento medio del número de casos de muerte en Bogotá D.C.:  inf
Mediana de crecimiento medio del número de casos de muerte en Bogotá D.C.:  1.034675615212528

MODELOS DE PREDICCIÓN BOGOTA

CASOS CONFIRMADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [20]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
model_scores=[]
In [21]:
model_arima= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_confirmados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2773.957, Time=0.04 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2725.467, Time=0.24 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2720.321, Time=0.23 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2722.314, Time=0.60 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2757.348, Time=0.05 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2721.214, Time=0.40 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2722.318, Time=0.67 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2711.602, Time=0.85 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2751.398, Time=0.07 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2720.608, Time=0.47 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2725.213, Time=0.60 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2674.518, Time=0.82 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2734.156, Time=0.11 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2704.383, Time=0.63 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2670.072, Time=0.94 sec
Total fit time: 6.745 seconds
Out[21]:
ARIMA(order=(3, 2, 2), scoring_args={}, suppress_warnings=True)
In [22]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [23]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  6730.264998707582
In [24]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para datos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos confirmados",))
fig.update_layout(title="Predicción de casos confirmados con el modelo ARIMA de Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Acum_confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [25]:
new_date=[]
ARIMA_model_new_prediction=[]
for i in range(1,18):
    new_date.append(df_Nuevo.index[-1]+timedelta(days=i))
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Confirmados","Predicción Modelo ARIMA"]).head()
Out[25]:
Confirmados Predicción Modelo ARIMA
0 2020-09-06 237681.200720
1 2020-09-07 241087.384758
2 2020-09-08 245098.645749
3 2020-09-09 248779.399814
4 2020-09-10 251487.100624

Modelo Prophet

In [26]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_confirmados"])),columns=['ds','y'])
In [27]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[27]:
<fbprophet.forecaster.Prophet at 0x23dc4ac7c88>
In [28]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [29]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [30]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  1712.448744156828
In [31]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [32]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS FALLECIDOS

Modelo ARIMA (Usando Auto-ARIMA)

In [33]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [34]:
model_arima= auto_arima(model_train["Acum_muertos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_muertos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=1291.537, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=1243.646, Time=0.09 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=1245.558, Time=0.18 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=1239.093, Time=0.21 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=1264.817, Time=0.09 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=1245.597, Time=0.15 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=1219.164, Time=0.52 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=1216.068, Time=0.57 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=1247.721, Time=0.11 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=1243.446, Time=0.21 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=1216.109, Time=0.67 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=1218.064, Time=0.63 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=1242.842, Time=0.22 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=1244.064, Time=0.30 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=1218.110, Time=0.85 sec
Total fit time: 4.839 seconds
Out[34]:
ARIMA(order=(1, 2, 3), scoring_args={}, suppress_warnings=True)
In [35]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [36]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  102.6034507493366
In [37]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_muertos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos fallecidos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_muertos"],
                    mode='lines+markers',name="Datos de validación para datos fallecidos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos fallecidos",))
fig.update_layout(title="Predicción de casos fallecidos con el modelo ARIMA de Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [38]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Fallecidos","Predicción Modelo ARIMA"]).head()
Out[38]:
Fallecidos Predicción Modelo ARIMA
0 2020-09-06 6049.848856
1 2020-09-07 6122.125185
2 2020-09-08 6194.830109
3 2020-09-09 6267.961834
4 2020-09-10 6341.518718

Modelo Prophet

In [39]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_muertos"])),columns=['ds','y'])
In [40]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[40]:
<fbprophet.forecaster.Prophet at 0x23dc52ff408>
In [41]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [42]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [43]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  55.28219715479642
In [44]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [45]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS RECUPERADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [46]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [47]:
model_arima= auto_arima(model_train["Acum_Recuperados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Recuperados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2741.255, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2732.736, Time=0.15 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2715.173, Time=0.30 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2715.029, Time=0.39 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2739.806, Time=0.04 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2717.461, Time=0.35 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2715.970, Time=0.49 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2711.496, Time=0.55 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2730.725, Time=0.06 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2714.173, Time=0.48 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2708.603, Time=0.60 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2699.653, Time=0.65 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2717.345, Time=0.08 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2713.450, Time=0.33 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2705.621, Time=0.65 sec
Total fit time: 5.166 seconds
Out[47]:
ARIMA(order=(2, 2, 3), scoring_args={}, suppress_warnings=True)
In [48]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [49]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  6848.360725692394
In [50]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos recuperados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de validación para datos recuperados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos recuperados",))
fig.update_layout(title="Predicción de casos recuperados con el modelo ARIMA de Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Acum_Recuperados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [51]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Recuperados","Predicción Modelo ARIMA"]).head()
Out[51]:
Recuperados Predicción Modelo ARIMA
0 2020-09-06 181365.889364
1 2020-09-07 186348.453820
2 2020-09-08 191687.834790
3 2020-09-09 196539.449099
4 2020-09-10 200742.739928

Modelo Prophet

In [52]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Recuperados"])),columns=['ds','y'])
In [53]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[53]:
<fbprophet.forecaster.Prophet at 0x23dc5489988>
In [54]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [55]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [56]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  2259.0476013128264
In [57]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [58]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS ACTIVOS

Modelo ARIMA (Usando Auto-ARIMA)

In [59]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [60]:
model_arima= auto_arima(model_train["Acum_Activos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Activos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2876.656, Time=0.03 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2859.017, Time=0.36 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2843.572, Time=0.31 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2856.169, Time=0.68 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2874.412, Time=0.04 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2845.175, Time=0.38 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2844.238, Time=0.44 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2818.987, Time=0.65 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2872.430, Time=0.06 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2837.309, Time=0.48 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2811.424, Time=0.63 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2813.451, Time=0.67 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2788.305, Time=0.10 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2784.160, Time=0.40 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2786.254, Time=0.21 sec
Total fit time: 5.458 seconds
Out[60]:
ARIMA(order=(3, 2, 1), scoring_args={}, suppress_warnings=True)
In [61]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [62]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  1654.3983633941402
In [63]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Activos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos activos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Activos"],
                    mode='lines+markers',name="Datos de validación para datos activos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos activos",))
fig.update_layout(title="Predicción de casos activos con el modelo ARIMA de Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [64]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Activos","Predicción Modelo ARIMA"]).head()
Out[64]:
Activos Predicción Modelo ARIMA
0 2020-09-06 53173.754531
1 2020-09-07 52053.345971
2 2020-09-08 49327.605775
3 2020-09-09 46506.231242
4 2020-09-10 44639.116821

Modelo Prophet

In [65]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Activos"])),columns=['ds','y'])
In [66]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[66]:
<fbprophet.forecaster.Prophet at 0x23dc5a73548>
In [67]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [68]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [69]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  10569.88334807062
In [70]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [71]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)